package model

import (
	"common/global"
	"errors"
	"gorm.io/gorm"
	"time"
)

type SeckillActivity struct {
	Id            int64     `gorm:"column:id;type:mediumint;comment:秒杀活动ID;primaryKey;not null;" json:"id"`                            // 秒杀活动ID
	ProductId     int64     `gorm:"column:product_id;type:mediumint;comment:关联的医疗商品ID;not null;" json:"product_id"`                    // 关联的医疗商品ID
	StartTime     time.Time `gorm:"column:start_time;type:datetime;comment:活动开始时间;not null;" json:"start_time"`                        // 活动开始时间
	EndTime       time.Time `gorm:"column:end_time;type:datetime;comment:活动结束时间;not null;" json:"end_time"`                            // 活动结束时间
	SeckillPrice  float64   `gorm:"column:seckill_price;type:decimal(8, 2);comment:秒杀价格;not null;" json:"seckill_price"`               // 秒杀价格
	OriginalPrice float64   `gorm:"column:original_price;type:decimal(8, 2);comment:商品原价;not null;" json:"original_price"`             // 商品原价
	SeckillStock  int64     `gorm:"column:seckill_stock;type:int;comment:秒杀库存;not null;default:0;" json:"seckill_stock"`               // 秒杀库存
	MaxPerUser    int64     `gorm:"column:max_per_user;type:int;comment:每人限购数量;not null;default:1;" json:"max_per_user"`               // 每人限购数量
	Status        int64     `gorm:"column:status;type:tinyint;comment:活动状态：0=未开始，1=进行中，2=已结束，3=已取消;not null;default:0;" json:"status"` // 活动状态：0=未开始，1=进行中，2=已结束，3=已取消
	CreatedAt     time.Time `gorm:"column:created_at;type:datetime;comment:创建时间;not null;" json:"created_at"`                          // 创建时间
	UpdatedAt     time.Time `gorm:"column:updated_at;type:datetime;comment:更新时间;not null;" json:"updated_at"`                          // 更新时间
}

func (SeckillActivity) TableName() string {
	return "seckill_activity"
}

func QuerySpikesProductInfo(id int64) (result *SeckillActivity, err error) {
	err = global.Db.Where("id = ?", id).Limit(1).Find(&result).Error
	return
}

func UpdateSpikesProductStatus(sid int64, status int) error {
	return global.Db.Model(&SeckillActivity{}).Where("id = ?", sid).Update("status", status).Error
}

func SpikesProductList(offset, size int64) (result []*SeckillActivity, err error) {
	err = global.Db.Model(&SeckillActivity{}).Offset(int(offset)).Limit(int(size)).Find(&result).Error
	if err != nil {
		return nil, err
	}
	return result, nil
}

func GetSpikesProductInfo(id int64) (result *SeckillActivity, err error) {
	err = global.Db.Where("id =?", id).Limit(1).Find(&result).Error
	if err != nil {
		return nil, err
	}
	return result, nil
}

// SeckillStockDel 扣减秒杀活动库存（支付成功时调用）
func SeckillStockDel(activityId int64, num int64) error {
	// 使用乐观锁扣减秒杀库存，防止超卖
	result := global.Db.Model(&SeckillActivity{}).Where("id = ? AND seckill_stock >= ?", activityId, num).Update("seckill_stock", gorm.Expr("seckill_stock - ?", num))
	if result.Error != nil {
		return result.Error
	}
	if result.RowsAffected == 0 {
		return errors.New("秒杀库存不足或活动不存在")
	}
	return nil
}

// SeckillStockAdd 增加秒杀活动库存（支付超时回滚时调用）
func SeckillStockAdd(activityId int64, num int64) error {
	err := global.Db.Model(&SeckillActivity{}).Where("id = ?", activityId).Update("seckill_stock", gorm.Expr("seckill_stock + ?", num)).Error
	if err != nil {
		return err
	}
	return nil
}
